\section{Ejercicio 3: \textit{mover}}
\subsection{Enunciado}
Definir la funci\'on
\texttt{ 
\\mover :: Movimiento $\to$ Juego $\to$ Maybe Juego
}
\\Si el movimiento es inv\'alido, devuelve Nothing. Si el movimiento es v\'alido, devuelve el estado
del juego despues de efectuar el movimiento dado. Para que un movimiento sea v\'alido se debe
controlar:
\begin{itemize}
\item Que las casillas de origen y destino no caigan fuera del tablero.
\item Que haya una ficha en la casilla de origen.
\item Que el color de la ficha movida coincida con el color del jugador al que le toca mover.
\item Que la ficha se mueva en la direcci\'on correcta, si no es una reina.
\item Que la casilla de destino est\'e libre.
\end{itemize}
En caso de tratarse de una captura, que la casilla intermedia contenga una ficha del
color del adversario.
Si el movimiento es v\'alido, observar la captura de fichas y la coronaci\'on de las fichas simples
en reinas.
\subsection{Codigo}

\scriptsize\begin{verbatim}

mover :: Movimiento -> Juego -> Maybe Juego
mover (M p d) (J c t) 
                -- la pos orig esta en el tablero
              | not (dentroDelTablero p) = Nothing 
                -- la posicion dest esta en el tablero (no captura)
              | not (dentroDelTablero (destino (M p d))) = Nothing               
                -- el contenido de la pos original no es vacio
              | contenido p t == Nothing = Nothing
                -- la posicion dest esta en el tablero (capturo)
              | (esCaptura (M p d) t c) && not (dentroDelTablero (destinoSiCaptura (M p d))) = Nothing 
                -- el color de la ficha tiene que ser el mismo del que le toca jugar
              | not (color (dameFicha (contenido p t)) == c) = Nothing
                -- chequea que pueda mover depende de que ficha es (Blanca, Negra, Simple o Reina)
              | not (puedeMover (dameFicha (contenido p t)) d) = Nothing
                -- el destino esta vacio (captura)
              | (esCaptura (M p d) t c) && not ((contenido (destinoSiCaptura (M p d)) t) == Nothing) = Nothing
                -- el destino esta vacio (no captura)
              | not (esCaptura (M p d) t c) && not ((contenido (destino (M p d)) t) == Nothing) = Nothing
                -- la ficha que capturo es la del color del rival
              | (esCaptura (M p d) t c) && (not (isNothing (contenido (destinoSiCaptura (M p d)) t))) && (color 
                (dameFicha(contenido (destinoSiCaptura (M p d)) t)) == c) = Nothing
                -- sino, hago la movida
              | otherwise = 
              (Just (J (invertirColor c) (
              if (esCaptura (M p d) t c) then
                 (sacar (fichaAComer (M p d)) (sacar p (poner (destinoSiCaptura (M p d))  (coronarSiSeDebe (dameFicha 
                 (contenido p t)) (destinoSiCaptura (M p d))) t)))
              else
                 (sacar p (poner (destino (M p d)) (coronarSiSeDebe (dameFicha (contenido p t)) (destino (M p d))) t)))))


 dentroDelTablero :: Posicion -> Bool
 dentroDelTablero (i, j) = i `elem` ['a'..'h'] && j `elem` [1..8]

 -- se fija si hay ficha que comer y que sea del color contrario, detalle...
 esCaptura :: Movimiento -> Tablero -> Color -> Bool
 esCaptura (M (i, j) d) t c = not (isNothing (contenido (destino (M (i, j) d)) t)) && 
                 (color (dameFicha (contenido (destino (M (i, j) d)) t)) == (invertirColor c)) 

 puedeMover :: Ficha -> Direccion -> Bool
 -- las reinas pueden mover en cualquier direccion
 puedeMover (Reina _) _ = True
 -- las simples blancas no pueden ir para el bottom
 puedeMover (Simple Blanca) TL = True
 puedeMover (Simple Blanca) TR = True
 puedeMover (Simple Blanca) _ = False
 -- las simples negras no pueden ir para el top
 puedeMover (Simple Negra) BL = True
 puedeMover (Simple Negra) BR = True
 puedeMover (Simple Negra) _ = False

 invertirColor :: Color -> Color
 invertirColor Blanca = Negra
 invertirColor Negra = Blanca

 -- renombro la funcion para aclarar!
 fichaAComer :: Movimiento -> Posicion
 fichaAComer = destino

 -- funcion parcial!!
 dameFicha :: Maybe Ficha -> Ficha
 dameFicha (Just f) = f

 -- corona si debe, segun su posicion destino
 coronarSiSeDebe :: Ficha -> Posicion -> Ficha
 coronarSiSeDebe (Simple Blanca) (x,y) = if y == 8 then (Reina Blanca) else (Simple Blanca)
 coronarSiSeDebe (Simple Negra) (x,y) = if y == 1 then (Reina Negra) else (Simple Negra)
 coronarSiSeDebe (Reina Blanca) _ = (Reina Blanca)
 coronarSiSeDebe (Reina Negra) _ = (Reina Negra)

\end{verbatim}
\normalsize
